/**
 * 支付处理器类
 * 业务层级：业务逻辑层
 * 功能说明：为支付流程提供统一的处理接口，支持现金、银行卡、微信、支付宝、会员余额等多种支付方式
 * 架构关系：遵循四层架构设计，负责协调支付相关的业务逻辑，处理支付验证、交易记录等核心功能
 */
#ifndef PAYMENTPROCESSOR_H
#define PAYMENTPROCESSOR_H

#include <QObject>
#include <QMap>
#include <QVariant>
#include "order.h"
#include "memberdao.h"

class PaymentProcessor : public QObject
{
    Q_OBJECT

public:
    explicit PaymentProcessor(QObject *parent = nullptr);

    // 设置依赖的DAO对象
    void setMemberDAO(MemberDAO *memberDAO);

    // 处理支付
    bool processPayment(int orderId, PaymentMethod method, double amount,
                       const QString &transactionNo = "", int customerId = 0);

    // 处理退款
    bool processRefund(int orderId, const QString &reason = "");

    // 获取支付方式名称
    static QString getPaymentMethodName(PaymentMethod method);

    // 获取所有支付方式
    static QMap<int, QString> getAllPaymentMethods();

    // 验证支付方式是否可用
    bool isPaymentMethodAvailable(PaymentMethod method, int customerId = 0);

    // 获取支付结果
    QMap<QString, QVariant> getPaymentResult() const;

signals:
    // 支付完成信号
    void paymentCompleted(int orderId, bool success, const QString &message);

    // 退款完成信号
    void refundCompleted(int orderId, bool success, const QString &message);

    // 错误信号
    void errorOccurred(const QString &errorMessage);

private:
    MemberDAO *m_memberDAO;
    QMap<QString, QVariant> m_paymentResult;

    // 处理现金支付
    bool processCashPayment(int orderId, double amount);

    // 处理银行卡支付
    bool processCardPayment(int orderId, double amount, const QString &transactionNo);

    // 处理微信支付
    bool processWechatPayment(int orderId, double amount, const QString &transactionNo);

    // 处理支付宝支付
    bool processAlipayPayment(int orderId, double amount, const QString &transactionNo);

    // 处理会员余额支付
    bool processMemberBalancePayment(int orderId, double amount, int customerId);

    // 生成交易号
    QString generateTransactionNo(PaymentMethod method);

    // 记录支付日志
    void logPayment(int orderId, PaymentMethod method, double amount,
                   const QString &transactionNo, bool success);
};
#endif // PAYMENTPROCESSOR_H
